Built with Alectryon, running Coq+SerAPI v8.15.0+0.15.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M
{|
evar_valuation := ρₑ;
svar_valuation :=
λsv' : svar,
if decide (x = sv') then ρₛ x else ρₛ sv'
|} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M
(λsv' : svar,
if decide (x = sv') then ρₛ x else ρₛ sv') = ρₛ
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M
∀x0 : svar,
(if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar
(if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar
(if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar e: x = x0
ρₛ x = ρₛ x0
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar n: x ≠ x0
ρₛ x0 = ρₛ x0
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar e: x = x0
ρₛ x = ρₛ x0
signature: Signature M: Model ρₑ: evar → M ρₛ: svar → propset M x0: svar
ρₛ x0 = ρₛ x0
reflexivity.
signature: Signature M: Model x: svar ρₑ: evar → M ρₛ: svar → propset M x0: svar n: x ≠ x0
ρₛ x0 = ρₛ x0
reflexivity.Qed.(* We use propositional extensionality here. *)
signature: Signature M: Model
LeibnizEquiv (propset M)
signature: Signature M: Model
LeibnizEquiv (propset M)
signature: Signature M: Model x, y: propset M H: x ≡ y
x = y
signature: Signature M: Model x, y: propset M H: set_equiv_instance x y
x = y
signature: Signature M: Model x, y: propset M H: ∀x0 : M, x0 ∈ x ↔ x0 ∈ y
x = y
signature: Signature M: Model propset_car, propset_car0: M → Prop H: ∀x : M,
x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]}
{[ x | propset_car x ]} = {[ x | propset_car0 x ]}
signature: Signature M: Model propset_car, propset_car0: M → Prop H: ∀x : M,
x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]}
propset_car = propset_car0
signature: Signature M: Model propset_car, propset_car0: M → Prop H: ∀x : M,
x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]}
∀x : M, propset_car x = propset_car0 x
signature: Signature M: Model propset_car, propset_car0: M → Prop H: ∀x : M,
x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]} x: M
propset_car x = propset_car0 x
signature: Signature M: Model propset_car, propset_car0: M → Prop H: ∀x : M,
x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]} x: M
propset_car x ↔ propset_car0 x
signature: Signature M: Model propset_car, propset_car0: M → Prop x: M H: x ∈ {[ x | propset_car x ]}
↔ x ∈ {[ x | propset_car0 x ]}
propset_car x ↔ propset_car0 x
signature: Signature M: Model propset_car, propset_car0: M → Prop x: M H1: x ∈ {[ x | propset_car x ]}
→ x ∈ {[ x | propset_car0 x ]} H2: x ∈ {[ x | propset_car0 x ]}
→ x ∈ {[ x | propset_car x ]}
propset_car x ↔ propset_car0 x
split; auto.Qed.(* extending pointwise application *)PolymorphicDefinitionapp_ext
(lr : propset (Domain M)) :
propset (Domain M) :=
PropSet (fun (e : (Domain M)) => exists (lere : (Domain M)), le ∈ l /\ re ∈ r /\ e ∈ (app_interp _) le re).
signature: Signature M: Model
∀S : propset M, app_ext S ∅ = ∅
signature: Signature M: Model
∀S : propset M, app_ext S ∅ = ∅
signature: Signature M: Model S: propset M
app_ext S ∅ = ∅
signature: Signature M: Model S: propset M
{[ e | ∃lere : M,
le ∈ S ∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]} =
∅
signature: Signature M: Model S: propset M
∀x : M,
x
∉ {[ e | ∃lere : M,
le ∈ S ∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]}
signature: Signature M: Model S: propset M x: M Hcontra: x
∈ {[ e | ∃lere : M,
le ∈ S
∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]}
False
signature: Signature M: Model S: propset M x: M Hcontra: ∃lere : M,
le ∈ S ∧ re ∈ ∅ ∧ x ∈ app_interp M le re
False
signature: Signature M: Model S: propset M x, le, re: M H1: le ∈ S H2: re ∈ ∅ H3: x ∈ app_interp M le re
False
signature: Signature M: Model S: propset M x, le, re: M H1: le ∈ S H2: False H3: x ∈ app_interp M le re
False
exact H2.Qed.
signature: Signature M: Model
∀S : propset M, app_ext ∅ S = ∅
signature: Signature M: Model
∀S : propset M, app_ext ∅ S = ∅
signature: Signature M: Model S: propset M
app_ext ∅ S = ∅
signature: Signature M: Model S: propset M
{[ e | ∃lere : M,
le ∈ ∅ ∧ re ∈ S ∧ e ∈ app_interp M le re ]} =
∅
signature: Signature M: Model S: propset M
∀x : M,
x
∉ {[ e | ∃lere : M,
le ∈ ∅ ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature M: Model S: propset M x: M Hcontra: x
∈ {[ e | ∃lere : M,
le ∈ ∅
∧ re ∈ S ∧ e ∈ app_interp M le re ]}
False
signature: Signature M: Model S: propset M x: M Hcontra: ∃lere : M,
le ∈ ∅ ∧ re ∈ S ∧ x ∈ app_interp M le re
False
signature: Signature M: Model S: propset M x, le, re: M H1: le ∈ ∅ H2: re ∈ S H3: x ∈ app_interp M le re
False
signature: Signature M: Model S: propset M x, le, re: M H1: False H2: re ∈ S H3: x ∈ app_interp M le re
False
exact H1.Qed.
signature: Signature M: Model
∀S1S2S : propset M,
S1 ⊆ S2 → app_ext S1 S ⊆ app_ext S2 S
signature: Signature M: Model
∀S1S2S : propset M,
S1 ⊆ S2 → app_ext S1 S ⊆ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: S1 ⊆ S2
app_ext S1 S ⊆ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2
app_ext S1 S ⊆ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2
∀x : M, x ∈ app_ext S1 S → x ∈ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x: M H': x ∈ app_ext S1 S
x ∈ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x: M H': x
∈ {[ e | ∃lere : M,
le ∈ S1
∧ re ∈ S ∧ e ∈ app_interp M le re ]}
x ∈ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x: M H': ∃lere : M,
le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re
x ∈ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x, le, re: M H1: le ∈ S1 H2: re ∈ S H3: x ∈ app_interp M le re
x ∈ app_ext S2 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x, le, re: M H1: le ∈ S1 H2: re ∈ S H3: x ∈ app_interp M le re
x
∈ {[ e | ∃lere : M,
le ∈ S2 ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x, le, re: M H1: le ∈ S1 H2: re ∈ S H3: x ∈ app_interp M le re
∃lere : M, le ∈ S2 ∧ re ∈ S ∧ x ∈ app_interp M le re
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S1 → x ∈ S2 x, le, re: M H1: le ∈ S1 H2: re ∈ S H3: x ∈ app_interp M le re
le ∈ S2 ∧ re ∈ S ∧ x ∈ app_interp M le re
firstorder.Qed.
signature: Signature M: Model
∀SS1S2 : propset M,
S1 ⊆ S2 → app_ext S S1 ⊆ app_ext S S2
signature: Signature M: Model
∀SS1S2 : propset M,
S1 ⊆ S2 → app_ext S S1 ⊆ app_ext S S2
signature: Signature M: Model S1, S2, S: propset M H: S2 ⊆ S
app_ext S1 S2 ⊆ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S
app_ext S1 S2 ⊆ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S
∀x : M, x ∈ app_ext S1 S2 → x ∈ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x: M H': x ∈ app_ext S1 S2
x ∈ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x: M H': x
∈ {[ e | ∃lere : M,
le ∈ S1
∧ re ∈ S2 ∧ e ∈ app_interp M le re ]}
x ∈ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x: M H': ∃lere : M,
le ∈ S1 ∧ re ∈ S2 ∧ x ∈ app_interp M le re
x ∈ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x, le, re: M H1: le ∈ S1 H2: re ∈ S2 H3: x ∈ app_interp M le re
x ∈ app_ext S1 S
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x, le, re: M H1: le ∈ S1 H2: re ∈ S2 H3: x ∈ app_interp M le re
x
∈ {[ e | ∃lere : M,
le ∈ S1 ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x, le, re: M H1: le ∈ S1 H2: re ∈ S2 H3: x ∈ app_interp M le re
∃lere : M, le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re
signature: Signature M: Model S1, S2, S: propset M H: ∀x : M, x ∈ S2 → x ∈ S x, le, re: M H1: le ∈ S1 H2: re ∈ S2 H3: x ∈ app_interp M le re
le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re
firstorder.Qed.(* Semantics of AML ref. snapshot: Definition 3 *)LetOS := PropsetOrderedSet (Domain M).LetL := PowersetLattice (Domain M).
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ $ ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ $ ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ ---> ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ ---> ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ex , ϕ') → propset M x:= fresh_evar ϕ': evar e: M ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < size (ex , ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < size (mu , ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ $ ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ $ ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ ---> ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ₁, ϕ₂: Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ ---> ϕ₂)
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ex , ϕ') → propset M x:= fresh_evar ϕ': evar e: M ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < size (ex , ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < size (mu , ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ex , ϕ') → propset M x:= fresh_evar ϕ': evar e: M ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < S (size ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ex , ϕ') → propset M x:= fresh_evar ϕ': evar e: M ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < S (size ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (ex , ϕ') → propset M x:= fresh_evar ϕ': evar e: M ρ':= update_evar_val x e ρ: Valuation
size ϕ' < S (size ϕ')
lia.
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern eval: Valuation
→ ∀x0 : Pattern,
size x0 < size (mu , ϕ') → propset M X:= fresh_svar ϕ': svar S: propset M ρ':= update_svar_val X S ρ: Valuation
size ϕ' < Datatypes.S (size ϕ')
lia.}Defined.DefinitionFassocρϕX :=
λS, eval (update_svar_val X S ρ) ϕ.
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation x: evar
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
eval ρ (ex , ϕ') =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
eval ρ (ex , ϕ') =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ'^{evar:0↦x}))
reflexivity.Qed.
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
eval ρ (mu , ϕ') =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
eval ρ (mu , ϕ') =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model OS:= PropsetOrderedSet M: OrderedSet (propset M) L:= PowersetLattice M: CompleteLattice (propset M) ρ: Valuation ϕ': Pattern
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ ineval ρ' ϕ'^{svar:0↦X})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ ineval ρ' ϕ'^{svar:0↦X}))
reflexivity.Qed.(* TODO extend with derived constructs using typeclasses *)Definitioneval_simpl :=
( eval_free_evar_simpl,
eval_free_svar_simpl,
eval_bound_evar_simpl,
eval_bound_svar_simpl,
eval_sym_simpl,
eval_app_simpl,
eval_bott_simpl,
eval_imp_simpl,
eval_ex_simpl,
eval_mu_simpl
).Endwith_model.Sectionwith_explicit_model.Context (M : Model).(* Model predicate. Useful mainly if the pattern is well-formed. *)DefinitionM_predicate (ϕ : Pattern) : Prop := forallρ,
@eval M ρ ϕ = ⊤ \/ eval ρ ϕ = ∅.
eval ρ (ex , ϕ) = ⊤
↔ (∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
eval ρ (ex , ϕ) = ⊤
↔ (∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
M_predicate (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
eval ρ (ex , ϕ) ≠ ∅
↔ (∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
M_predicate (ex , ϕ)
apply Hpredex.
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
eval ρ (ex , ϕ) ≠ ∅
↔ (∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
(* (* TODO: I would like to simplify the RHS, but cannot find a way. *) under [fun m => _]functional_extensionality => m. (* This fails *) Fail rewrite <- predicate_not_empty_iff_full. Fail rewrite -[_ = Full]predicate_not_empty_iff_full. over. *)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
(∃x : M, x ∈ eval ρ (ex , ϕ))
↔ (∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
(∃x : M, x ∈ eval ρ (ex , ϕ))
→ ∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
(∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
→ ∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
(∃x : M, x ∈ eval ρ (ex , ϕ))
→ ∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0: M Hx0: x0 ∈ eval ρ (ex , ϕ)
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0: M Hx0: x0
∈ (letx := fresh_evar ϕ in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ^{evar:0↦x}))
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0: M Hx0: x0
∈ propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ})
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0: M Hx0: x0
∈ {[ x | ∃c : M,
x
∈ eval
(update_evar_val
(fresh_evar ϕ) c ρ)
ϕ^{evar:0↦
fresh_evar ϕ} ]}
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0: M Hx0: ∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
∃m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
eval (update_evar_val x c ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
M_predicate ϕ^{evar:0↦x}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
eval (update_evar_val x c ρ) ϕ^{evar:0↦x} ≠ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
M_predicate ϕ^{evar:0↦x}
apply Hpred.
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
eval (update_evar_val x c ρ) ϕ^{evar:0↦x} ≠ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
∃x0 : M,
x0 ∈ eval (update_evar_val x c ρ) ϕ^{evar:0↦x}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) x0, c: M Hc: x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
x0 ∈ eval (update_evar_val x c ρ) ϕ^{evar:0↦x}
apply Hc.
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ)
(∃m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
→ ∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m: M Hm: eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m: M Hm: eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ≠ Empty
∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m: M Hm: ∃x0 : M,
x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
∃x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0 ∈ eval ρ (ex , ϕ)
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0
∈ (letx := fresh_evar ϕ in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ^{evar:0↦x}))
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0
∈ propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0
∈ {[ x | ∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ} ]}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar Hpred: M_predicate ϕ^{evar:0↦x} Hpredex: M_predicate (ex , ϕ) m, x0: M Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0
∈ eval (update_evar_val (fresh_evar ϕ) m ρ)
ϕ^{evar:0↦fresh_evar ϕ}
assumption.Qed.
signature: Signature M: Model ϕ: Pattern ρ: Valuation
letx := fresh_evar ϕ ineval ρ (ex , ϕ) = ∅
↔ (∀m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature M: Model ϕ: Pattern ρ: Valuation
letx := fresh_evar ϕ ineval ρ (ex , ϕ) = ∅
↔ (∀m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
(letx := fresh_evar ϕ in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' ϕ^{evar:0↦x})) = ∅
↔ (∀m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
⊆ propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ})
→ ∀m : M,
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
x
∈ propset_fa_union
(λe : M,
eval
(update_evar_val (fresh_evar ϕ) e ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
x
∈ {[ x0 | ∃c : M,
x0
∈ eval
(update_evar_val
(fresh_evar ϕ) c ρ)
ϕ^{evar:0↦
fresh_evar ϕ} ]} →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅
⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
∅ ⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
∅ ⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
apply empty_subseteq.
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m: M
∀x0 : M,
x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
→ x0 ∈ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m, x0: M
x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
→ x0 ∈ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar H1: ∀x : M,
(∃c : M,
x
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x ∈ ∅ m, x0: M Contra: x0
∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0 ∈ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar x0: M H1: (∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x0 ∈ ∅ m: M Contra: x0
∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0 ∈ ∅
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar x0: M H1: (∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x0 ∈ ∅ m: M Contra: x0
∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}
signature: Signature M: Model ϕ: Pattern ρ: Valuation x:= fresh_evar ϕ: evar x0: M H1: (∃c : M,
x0
∈ eval (update_evar_val (fresh_evar ϕ) c ρ)
ϕ^{evar:0↦fresh_evar ϕ}) →
x0 ∈ ∅ m: M Contra: x0
∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
x0
∈ eval (update_evar_val (fresh_evar ϕ) m ρ)
ϕ^{evar:0↦fresh_evar ϕ}
satisfies_theory M (theory_of_NamedAxioms NAs)
↔ (∀n : NAName NAs, satisfies_model M (NAAxiom NAs n))
signature, Σ: Signature NAs: NamedAxioms M: Model
satisfies_theory M (theory_of_NamedAxioms NAs)
↔ (∀n : NAName NAs, satisfies_model M (NAAxiom NAs n))
signature, Σ: Signature NAs: NamedAxioms M: Model
satisfies_theory M (theory_of_NamedAxioms NAs)
→ ∀n : NAName NAs, satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature NAs: NamedAxioms M: Model
(∀n : NAName NAs, satisfies_model M (NAAxiom NAs n))
→ satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature NAs: NamedAxioms M: Model
satisfies_theory M (theory_of_NamedAxioms NAs)
→ ∀n : NAName NAs, satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature NAs: NamedAxioms M: Model H: satisfies_theory M (theory_of_NamedAxioms NAs) n: NAName NAs
satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀axiom : Pattern,
axiom ∈ theory_of_NamedAxioms NAs
→ satisfies_model M axiom n: NAName NAs
satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature NAs: NamedAxioms M: Model n: NAName NAs H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
→ satisfies_model M (NAAxiom NAs n)
satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature NAs: NamedAxioms M: Model n: NAName NAs H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
→ satisfies_model M (NAAxiom NAs n)
NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
signature, Σ: Signature NAs: NamedAxioms M: Model n: NAName NAs H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
→ satisfies_model M (NAAxiom NAs n)
NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
signature, Σ: Signature NAs: NamedAxioms M: Model n: NAName NAs H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
→ satisfies_model M (NAAxiom NAs n)
NAAxiom NAs n
∈ {[ p | ∃n : NAName NAs, p = NAAxiom NAs n ]}
signature, Σ: Signature NAs: NamedAxioms M: Model n: NAName NAs H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
→ satisfies_model M (NAAxiom NAs n)
NAAxiom NAs n = NAAxiom NAs n
auto.
signature, Σ: Signature NAs: NamedAxioms M: Model
(∀n : NAName NAs, satisfies_model M (NAAxiom NAs n))
→ satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n)
satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n) ax: Pattern Hax: ax ∈ theory_of_NamedAxioms NAs
satisfies_model M ax
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n) ax: Pattern Hax: ax ∈ theory_of_NamedAxioms NAs
satisfies_model M ax
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n) ax: Pattern Hax: ax
∈ {[ p | ∃n : NAName NAs, p = NAAxiom NAs n ]}
satisfies_model M ax
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n) ax: Pattern axname: NAName NAs Haxname: ax = NAAxiom NAs axname
satisfies_model M ax
signature, Σ: Signature NAs: NamedAxioms M: Model H: ∀n : NAName NAs,
satisfies_model M (NAAxiom NAs n) axname: NAName NAs
satisfies_model M (NAAxiom NAs axname)
apply H.Qed.
signature: Signature M: Model Γ₁, Γ₂: Theory
Γ₁ ⊆ Γ₂
→ satisfies_theory M Γ₂ → satisfies_theory M Γ₁
signature: Signature M: Model Γ₁, Γ₂: Theory
Γ₁ ⊆ Γ₂
→ satisfies_theory M Γ₂ → satisfies_theory M Γ₁
(∀M : Model, satisfies_theory M Γ → M_predicate M ϕ₁)
→ (∀M : Model,
satisfies_theory M Γ → M_predicate M ϕ₂)
→ ∀M : Model,
satisfies_theory M Γ
→ M_predicate M (ϕ₁ ---> ϕ₂)
signature: Signature Γ: Theory ϕ₁, ϕ₂: Pattern H: ∀M : Model,
satisfies_theory M Γ → M_predicate M ϕ₁ H0: ∀M : Model,
satisfies_theory M Γ → M_predicate M ϕ₂ M: Model H1: satisfies_theory M Γ
M_predicate M (ϕ₁ ---> ϕ₂)
auto using M_predicate_impl.Qed.Hint Resolve T_predicate_impl : core.
signature: Signature Γ: Theory
T_predicate Γ ⊥
signature: Signature Γ: Theory
T_predicate Γ ⊥
signature: Signature Γ: Theory
∀M : Model, satisfies_theory M Γ → M_predicate M ⊥
signature: Signature Γ: Theory M: Model H: satisfies_theory M Γ
M_predicate M ⊥
auto using M_predicate_bott.Qed.Hint Resolve T_predicate_bot : core.(* TODO: top iff exists forall *)Sectionwith_model.Context {M : Model}.(* If phi1 \subseteq phi2, then U_x phi1 \subseteq U_x phi2 *)
signature: Signature M: Model x: evar ϕ₁, ϕ₂: Pattern
(∀ρ : Valuation, eval ρ ϕ₁ ⊆ eval ρ ϕ₂)
→ ∀ρ : Valuation,
propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₁)
⊆ propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₂)
signature: Signature M: Model x: evar ϕ₁, ϕ₂: Pattern
(∀ρ : Valuation, eval ρ ϕ₁ ⊆ eval ρ ϕ₂)
→ ∀ρ : Valuation,
propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₁)
⊆ propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₂)
∀ρ : Valuation,
propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₁)
⊆ propset_fa_union
(λe : M, eval (update_evar_val x e ρ) ϕ₂)
induction ϕ₁; intros; apply propset_fa_union_included; auto.Qed.(* eval unchanged when using fresh element varaiable *)
signature: Signature M: Model ρ: Valuation x: evar v: M ϕ: Pattern
evar_is_fresh_in x ϕ
→ eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation x: evar v: M ϕ: Pattern
evar_is_fresh_in x ϕ
→ eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation x: evar v: M ϕ: Pattern Hfr: evar_is_fresh_in x ϕ
eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation x: evar v: M ϕ: Pattern Hfr: x ∉ free_evars ϕ
eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]}
{[evar_valuation (update_evar_val x0 v ρ0) x]} =
{[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁
∪ eval (update_evar_val x v ρ0) ϕ₂ =
eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁
∪ eval (update_evar_val x v ρ0) ϕ₂ =
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ')
(letx0 := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x0 e (update_evar_val x v ρ0)
ineval ρ' ϕ'^{evar:0↦x0})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ')
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' :=
update_svar_val X S (update_evar_val x v ρ0)
ineval ρ' ϕ'^{svar:0↦X})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]}
{[evar_valuation (update_evar_val x0 v ρ0) x]} =
{[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]}
{[if decide (x0 = x) then v else evar_valuation ρ0 x]} =
{[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]} e: x0 = x
{[v]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]} n: x0 ≠ x
{[evar_valuation ρ0 x]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]} e: x0 = x
{[v]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation v: M x: evar Hfr: x ∉ {[x]}
{[v]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation v: M x: evar Hfr: x ∉ {[x]}
{[v]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation v: M x: evar Hfr: x ∉ {[x]}
{[v]} = {[evar_valuation ρ0 x]}
signature: Signature M: Model ρ0: Valuation v: M x: evar Hfr: x ≠ x
{[v]} = {[evar_valuation ρ0 x]}
contradiction.
signature: Signature M: Model ρ0: Valuation x0: evar v: M x: evar Hfr: x0 ∉ {[x]} n: x0 ≠ x
{[evar_valuation ρ0 x]} = {[evar_valuation ρ0 x]}
reflexivity.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
x ∉ free_evars ϕ₁
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
x ∉ free_evars ϕ₁
set_solver.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
x ∉ free_evars ϕ₂
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ₁, ϕ₂: Pattern H: x ∉ free_evars ϕ₁
→ eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: x ∉ free_evars ϕ₂
→ eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂ Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁)
(eval (update_evar_val x v ρ0) ϕ₂) =
eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ')
(letx0 := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x0 e (update_evar_val x v ρ0)
ineval ρ' ϕ'^{evar:0↦x0})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ')
propset_fa_union
(λe : M,
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ')
(λe : M,
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
(λe : M,
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ')
∀x0 : M,
eval
(update_evar_val (fresh_evar ϕ') x0
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') x0 ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Heq: fresh_evar ϕ' = x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Heq: fresh_evar ϕ' = x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Heq: fresh_evar ϕ' = x
eval (update_evar_val x e (update_evar_val x v ρ0))
ϕ'^{evar:0↦x} =
eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Heq: fresh_evar ϕ' = x
eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x} =
eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x}
reflexivity.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
fresh_evar ϕ' ≠ x
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} Hfeeo: free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
⊆ {[fresh_evar ϕ']} ∪ free_evars ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} Hfeeo: ∀x : evar,
x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
→ x ∈ {[fresh_evar ϕ']} ∪ free_evars ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} Hfeeo: x ∈ {[fresh_evar ϕ']} ∪ free_evars ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} Hfeeo: x ∈ {[fresh_evar ϕ']} ∨ x ∈ free_evars ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': x ∈ {[fresh_evar ϕ']}
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': x ∈ free_evars ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': x ∈ {[fresh_evar ϕ']}
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': x = fresh_evar ϕ'
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': fresh_evar ϕ' = x
False
contradiction.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} H': x ∈ free_evars ϕ'
False
contradiction.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0) =
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
fresh_evar ϕ' ≠ x
apply Hneq.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
eval
(update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
update_evar_val (fresh_evar ϕ') e
(update_evar_val x v ρ0) =
update_evar_val x v
(update_evar_val (fresh_evar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_evar_val x v ρ0) (ex , ϕ') e: M Hneq: fresh_evar ϕ' ≠ x
fresh_evar ϕ' ≠ x
apply Hneq.}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ')
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' :=
update_svar_val X S (update_evar_val x v ρ0)
ineval ρ' ϕ'^{svar:0↦X})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ')
LeastFixpointOf
(λS : propset M,
eval
(update_svar_val (fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
LeastFixpointOf
(λS : propset M,
eval (update_svar_val (fresh_svar ϕ') S ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ')
(λS : propset M,
eval
(update_svar_val (fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
(λS : propset M,
eval (update_svar_val (fresh_svar ϕ') S ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ')
∀x0 : propset M,
eval
(update_svar_val (fresh_svar ϕ') x0
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') x0 ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
{|
pr1 :=
update_svar_val (fresh_svar ϕ')
?S (update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ')
?S (update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
{|
pr1 :=
update_svar_val (fresh_svar ϕ')
?S (update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ')
?S (update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M Contra: x ∈ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
False
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M Contra: x ∈ free_evars ϕ'
False
contradiction.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
{|
pr1 :=
update_svar_val (fresh_svar ϕ') ?S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ')
?S (update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
{|
pr1 :=
update_svar_val (fresh_svar ϕ') ?S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
reflexivity.
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_evar_val x v
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation x: evar v: M ϕ': Pattern H: ∀ (S : propset M) (ρ : Valuation)
(x0 : evar) (v0 : M)
(ϕ : Pattern),
x0 ∉ free_evars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_evar_val x0 v0 ρ) ϕ
→ eval (update_evar_val x0 v0 ρ) ϕ =
eval ρ ϕ Hfr: x ∉ free_evars ϕ' Heqcall: LeastFixpointOf
(λS : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_evar_val x v ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val (fresh_svar ϕ') e
(update_evar_val x v ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity.Qed.
signature: Signature M: Model ρ: Valuation X: svar S: propset M ϕ: Pattern
svar_is_fresh_in X ϕ
→ eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation X: svar S: propset M ϕ: Pattern
svar_is_fresh_in X ϕ
→ eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation X: svar S: propset M ϕ: Pattern Hfr: svar_is_fresh_in X ϕ
eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ: Valuation X: svar S: propset M ϕ: Pattern Hfr: X ∉ free_svars ϕ
eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]}
svar_valuation (update_svar_val X0 S ρ0) X =
svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ0)
ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]}
svar_valuation (update_svar_val X0 S ρ0) X =
svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]}
svar_valuation
{|
evar_valuation := evar_valuation ρ0;
svar_valuation :=
λsv' : svar,
if decide (X0 = sv')
then S
else svar_valuation ρ0 sv'
|} X = svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]}
(if decide (X0 = X) then S else svar_valuation ρ0 X) =
svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]} e: X0 = X
S = svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]} n: X0 ≠ X
svar_valuation ρ0 X = svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]} e: X0 = X
S = svar_valuation ρ0 X
signature: Signature M: Model ρ0: Valuation S: propset M X: svar Hfr: X ∉ {[X]}
S = svar_valuation ρ0 X
signature: Signature M: Model ρₑ: evar → M ρₛ: svar → propset M S: propset M X: svar Hfr: X ∉ {[X]}
S =
svar_valuation
{| evar_valuation := ρₑ; svar_valuation := ρₛ |} X
signature: Signature M: Model ρₑ: evar → M ρₛ: svar → propset M S: propset M X: svar Hfr: X ∉ {[X]}
S = ρₛ X
signature: Signature M: Model ρₑ: evar → M ρₛ: svar → propset M S: propset M X: svar Hfr: X ≠ X
S = ρₛ X
contradiction.
signature: Signature M: Model ρ0: Valuation X0: svar S: propset M X: svar Hfr: X0 ∉ {[X]} n: X0 ≠ X
svar_valuation ρ0 X = svar_valuation ρ0 X
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ0)
ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
X ∉ free_svars ϕ₁
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
X ∉ free_svars ϕ₁
set_solver.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
X ∉ free_svars ϕ₂
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁)
(eval (update_svar_val X S ρ0) ϕ₂) =
eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ0)
ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
X ∉ free_svars ϕ₁
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ₁, ϕ₂: Pattern H: X ∉ free_svars ϕ₁
→ eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁ H0: X ∉ free_svars ϕ₂
→ eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂ Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂ Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁
∪ eval (update_svar_val X S ρ0) ϕ₂ =
eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ0)
ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ0)
ineval ρ' ϕ'^{evar:0↦x})) =
(letx := fresh_evar ϕ' in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ0 ineval ρ' ϕ'^{evar:0↦x}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
propset_fa_union
(λe : M,
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
propset_fa_union
(λe : M,
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
(λe : M,
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
(λe : M,
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ')
∀x : M,
eval
(update_evar_val (fresh_evar ϕ') x
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') x ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_evar_val (fresh_evar ϕ') e ρ0)
ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
svar_is_fresh_in X ϕ'
apply Hfr.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
{|
pr1 :=
update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|}
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_evar_val (fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (e : M) (ρ : Valuation)
(X0 : svar) (S0 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{evar:0↦fresh_evar ϕ'}
|} =
{| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |}
→ eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval (update_svar_val X0 S0 ρ) ϕ
→ eval (update_svar_val X0 S0 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}) =
eval (update_svar_val X S ρ0) (ex , ϕ') e: M
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'} =
eval
(update_svar_val X S
(update_evar_val (fresh_evar ϕ') e ρ0))
ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity.}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(letX0 := fresh_svar ϕ' in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ0)
ineval ρ' ϕ'^{svar:0↦X0})) =
(letX := fresh_svar ϕ' in
LeastFixpointOf
(λS : propset M,
letρ' := update_svar_val X S ρ0 ineval ρ' ϕ'^{svar:0↦X}))
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
(λS0 : propset M,
letρ' :=
update_svar_val (fresh_svar ϕ') S0
(update_svar_val X S ρ0) ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) =
(λS : propset M,
letρ' := update_svar_val (fresh_svar ϕ') S ρ0 ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ')
∀x : propset M,
(letρ' :=
update_svar_val (fresh_svar ϕ') x
(update_svar_val X S ρ0) ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) =
(letρ' := update_svar_val (fresh_svar ϕ') x ρ0 ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M
(letρ' :=
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0) ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) =
(letρ' := update_svar_val (fresh_svar ϕ') e ρ0 ineval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Heq: fresh_svar ϕ' = X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Heq: fresh_svar ϕ' = X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Heq: fresh_svar ϕ' = X
eval (update_svar_val X e (update_svar_val X S ρ0))
ϕ'^{svar:0↦X} =
eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Heq: fresh_svar ϕ' = X
eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X} =
eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X}
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
fresh_svar ϕ' ≠ X
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
fresh_svar ϕ' ≠ X
apply Hneq.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
{|
pr1 :=
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val (fresh_svar ϕ') e ρ0)
ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
{|
pr1 :=
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} Hfeeo: free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
⊆ {[fresh_svar ϕ']} ∪ free_svars ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} Hfeeo: ∀x : svar,
x ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
→ x ∈ {[fresh_svar ϕ']} ∪ free_svars ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} Hfeeo: X ∈ {[fresh_svar ϕ']} ∪ free_svars ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} Hfeeo: X ∈ {[fresh_svar ϕ']} ∨ X ∈ free_svars ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': X ∈ {[fresh_svar ϕ']}
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': X ∈ free_svars ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': X ∈ {[fresh_svar ϕ']}
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': X = fresh_svar ϕ'
False
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': fresh_svar ϕ' = X
False
contradiction.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} H': X ∈ free_svars ϕ'
False
contradiction.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
{|
pr1 :=
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
{|
pr1 :=
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{|
pr1 :=
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
fresh_svar ϕ' ≠ X
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
reflexivity.
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
eval
(update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval
(update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val (fresh_svar ϕ') e
(update_svar_val X S ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
fresh_svar ϕ' ≠ X
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature M: Model ρ0: Valuation X: svar S: propset M ϕ': Pattern H: ∀ (S0 : propset M) (ρ : Valuation)
(X0 : svar) (S1 : propset M)
(ϕ : Pattern),
X0 ∉ free_svars ϕ
→ {|
pr1 :=
update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0);
pr2 := ϕ'^{svar:0↦fresh_svar ϕ'}
|} =
{| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |}
→ eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'} =
eval (update_svar_val X0 S1 ρ) ϕ
→ eval (update_svar_val X0 S1 ρ) ϕ =
eval ρ ϕ Hfr: X ∉ free_svars ϕ' Heqcall: LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ') S0
(update_svar_val X S ρ0))
ϕ'^{svar:0↦fresh_svar ϕ'}) =
eval (update_svar_val X S ρ0) (mu , ϕ') e: propset M Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0) =
update_svar_val X S
(update_svar_val (fresh_svar ϕ') e ρ0)
reflexivity.}}Qed.(* Can change updated/opened fresh variable variable *)
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature M: Model sz: nat
∀ (ϕ : Pattern) (dbi : db_index) (ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
signature: Signature M: Model
∀ (ϕ : Pattern) (dbi : db_index) (ρ : Valuation),
size ϕ ≤ 0
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
∀ (ϕ : Pattern) (dbi : db_index) (ρ : Valuation),
size ϕ ≤ S sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
signature: Signature M: Model
∀ (ϕ : Pattern) (dbi : db_index) (ρ : Valuation),
size ϕ ≤ 0
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
(∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
(* base case - svar *)
signature: Signature M: Model ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X ϕ HfrY: svar_is_fresh_in Y ϕ
eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val X S ρ)
(patt_free_evar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y}
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ)
(patt_free_svar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ)
(patt_bound_evar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
(patt_bound_svar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ)
(patt_sym sigma)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y}
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature M: Model x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val X S ρ)
(patt_free_evar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y}
signature: Signature M: Model x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
{[evar_valuation (update_svar_val X S ρ) x]} =
{[evar_valuation (update_svar_val Y S ρ) x]}
reflexivity.
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ)
(patt_free_svar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y}
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_valuation (update_svar_val X S ρ) x =
svar_valuation (update_svar_val Y S ρ) x
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ∉ free_svars (patt_free_svar x) HfrY: Y ∉ free_svars (patt_free_svar x)
svar_valuation (update_svar_val X S ρ) x =
svar_valuation (update_svar_val Y S ρ) x
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ∉ {[x]} HfrY: Y ∉ {[x]}
svar_valuation (update_svar_val X S ρ) x =
svar_valuation (update_svar_val Y S ρ) x
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ≠ x HfrY: Y ∉ {[x]}
svar_valuation (update_svar_val X S ρ) x =
svar_valuation (update_svar_val Y S ρ) x
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ≠ x HfrY: Y ≠ x
svar_valuation (update_svar_val X S ρ) x =
svar_valuation (update_svar_val Y S ρ) x
signature: Signature M: Model x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ≠ x HfrY: Y ≠ x
svar_valuation
{|
evar_valuation := evar_valuation ρ;
svar_valuation :=
λsv' : svar,
if decide (X = sv')
then S
else svar_valuation ρ sv'
|} x =
svar_valuation
{|
evar_valuation := evar_valuation ρ;
svar_valuation :=
λsv' : svar,
if decide (Y = sv')
then S
else svar_valuation ρ sv'
|} x
signature: Signature M: Model x: svar dbi: db_index ρₑ: evar → M ρₛ: svar → propset M Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ≠ x HfrY: Y ≠ x
svar_valuation
{|
evar_valuation :=
evar_valuation
{|
evar_valuation := ρₑ; svar_valuation := ρₛ
|};
svar_valuation :=
λsv' : svar,
if decide (X = sv')
then S
else
svar_valuation
{|
evar_valuation := ρₑ;
svar_valuation := ρₛ
|} sv'
|} x =
svar_valuation
{|
evar_valuation :=
evar_valuation
{|
evar_valuation := ρₑ; svar_valuation := ρₛ
|};
svar_valuation :=
λsv' : svar,
if decide (Y = sv')
then S
else
svar_valuation
{|
evar_valuation := ρₑ;
svar_valuation := ρₛ
|} sv'
|} x
signature: Signature M: Model x: svar dbi: db_index ρₑ: evar → M ρₛ: svar → propset M Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: X ≠ x HfrY: Y ≠ x
(if decide (X = x) then S else ρₛ x) =
(if decide (Y = x) then S else ρₛ x)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ)
(patt_bound_evar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
∅ = ∅
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
(patt_bound_svar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
(patt_bound_svar n)^[svar:dbi↦patt_free_svar X] =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^[svar:dbi↦patt_free_svar Y]
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
match compare_nat n dbi with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => patt_free_svar X
| Nat_greater _ _ _ => patt_bound_svar (Nat.pred n)
end =
eval (update_svar_val Y S ρ)
match compare_nat n dbi with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => patt_free_svar Y
| Nat_greater _ _ _ => patt_bound_svar (Nat.pred n)
end
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
eval (update_svar_val X S ρ) (patt_bound_svar n) =
eval (update_svar_val Y S ρ) (patt_bound_svar n)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
eval (update_svar_val X S ρ) (patt_free_svar X) =
eval (update_svar_val Y S ρ) (patt_free_svar Y)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
eval (update_svar_val X S ρ)
(patt_bound_svar (Nat.pred n)) =
eval (update_svar_val Y S ρ)
(patt_bound_svar (Nat.pred n))
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
eval (update_svar_val X S ρ) (patt_bound_svar n) =
eval (update_svar_val Y S ρ) (patt_bound_svar n)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
∅ = ∅
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
eval (update_svar_val X S ρ) (patt_free_svar X) =
eval (update_svar_val Y S ρ) (patt_free_svar Y)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
svar_valuation (update_svar_val X S ρ) X =
svar_valuation (update_svar_val Y S ρ) Y
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
S = S
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
eval (update_svar_val X S ρ)
(patt_bound_svar (Nat.pred n)) =
eval (update_svar_val Y S ρ)
(patt_bound_svar (Nat.pred n))
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
∅ = ∅
reflexivity.
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ)
(patt_sym sigma)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y}
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
sym_interp M sigma = sym_interp M sigma
reflexivity.
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
(* base case - evar *)
signature: Signature M: Model ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x ϕ Hfry: evar_is_fresh_in y ϕ
eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val x c ρ)
(patt_free_evar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y}
signature: Signature M: Model x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ)
(patt_free_svar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
(patt_bound_evar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ)
(patt_bound_svar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y}
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ)
(patt_sym sigma)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y}
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val x c ρ)
(patt_free_evar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
{[evar_valuation (update_evar_val x c ρ) x0]} =
{[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ∉ free_evars (patt_free_evar x0) Hfry: y ∉ free_evars (patt_free_evar x0)
{[evar_valuation (update_evar_val x c ρ) x0]} =
{[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ∉ {[x0]} Hfry: y ∉ {[x0]}
{[evar_valuation (update_evar_val x c ρ) x0]} =
{[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ≠ x0 Hfry: y ∉ {[x0]}
{[evar_valuation (update_evar_val x c ρ) x0]} =
{[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ≠ x0 Hfry: y ≠ x0
{[evar_valuation (update_evar_val x c ρ) x0]} =
{[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ≠ x0 Hfry: y ≠ x0
evar_valuation (update_evar_val x c ρ) x0 =
evar_valuation (update_evar_val y c ρ) x0
signature: Signature M: Model x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ≠ x0 Hfry: y ≠ x0
evar_valuation
{|
evar_valuation :=
λev' : evar,
if decide (x = ev')
then c
else evar_valuation ρ ev';
svar_valuation := svar_valuation ρ
|} x0 =
evar_valuation
{|
evar_valuation :=
λev' : evar,
if decide (y = ev')
then c
else evar_valuation ρ ev';
svar_valuation := svar_valuation ρ
|} x0
signature: Signature M: Model x0: evar dbi: db_index ρₑ: evar → M ρₛ: svar → propset M Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: x ≠ x0 Hfry: y ≠ x0
signature: Signature M: Model x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ)
(patt_free_svar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y}
signature: Signature M: Model x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
svar_valuation (update_evar_val x c ρ) x0 =
svar_valuation (update_evar_val y c ρ) x0
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
(patt_bound_evar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
(patt_bound_evar n)^[evar:dbi↦patt_free_evar x] =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^[evar:dbi↦patt_free_evar y]
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
match compare_nat n dbi with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => patt_free_evar x
| Nat_greater _ _ _ => patt_bound_evar (Nat.pred n)
end =
eval (update_evar_val y c ρ)
match compare_nat n dbi with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => patt_free_evar y
| Nat_greater _ _ _ => patt_bound_evar (Nat.pred n)
end
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
eval (update_evar_val x c ρ) (patt_bound_evar n) =
eval (update_evar_val y c ρ) (patt_bound_evar n)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
eval (update_evar_val x c ρ) (patt_free_evar x) =
eval (update_evar_val y c ρ) (patt_free_evar y)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
eval (update_evar_val x c ρ)
(patt_bound_evar (Nat.pred n)) =
eval (update_evar_val y c ρ)
(patt_bound_evar (Nat.pred n))
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
eval (update_evar_val x c ρ) (patt_bound_evar n) =
eval (update_evar_val y c ρ) (patt_bound_evar n)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) l: n < dbi H: compare_nat n dbi = Nat_less n dbi l
∅ = ∅
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
eval (update_evar_val x c ρ) (patt_free_evar x) =
eval (update_evar_val y c ρ) (patt_free_evar y)
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
{[evar_valuation (update_evar_val x c ρ) x]} =
{[evar_valuation (update_evar_val y c ρ) y]}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) e: n = dbi H: compare_nat n dbi = Nat_equal n dbi e
{[c]} = {[c]}
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
eval (update_evar_val x c ρ)
(patt_bound_evar (Nat.pred n)) =
eval (update_evar_val y c ρ)
(patt_bound_evar (Nat.pred n))
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n) g: n > dbi H: compare_nat n dbi = Nat_greater n dbi g
∅ = ∅
reflexivity.
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ)
(patt_bound_svar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y}
signature: Signature M: Model n, dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
∅ = ∅
reflexivity.
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ)
(patt_sym sigma)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y}
signature: Signature M: Model sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
sym_interp M sigma = sym_interp M sigma
reflexivity.
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature M: Model dbi: db_index ρ: Valuation Hsz: 0 ≤ 0 x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
∅ = ∅
reflexivity.}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
∀ (ϕ : Pattern) (dbi : db_index) (ρ : Valuation),
size ϕ ≤ S sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
(∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
(* inductive case - svar *)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ϕ HfrY: svar_is_fresh_in Y ϕ
eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val X S ρ)
(patt_free_evar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ)
(patt_free_svar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ)
(patt_bound_evar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
(patt_bound_svar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ)
(patt_sym sigma)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
eval (update_svar_val X S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
eval (update_svar_val X S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
eval (update_svar_val X S ρ) (ex , ϕ)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ex , ϕ)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
eval (update_svar_val X S ρ) (mu , ϕ)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (mu , ϕ)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val X S ρ)
(patt_free_evar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
size (patt_free_evar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in X (patt_free_evar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in Y (patt_free_evar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ)
(patt_free_evar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
size (patt_free_evar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in X (patt_free_evar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in Y (patt_free_evar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
size (patt_free_evar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_evar x) HfrY: svar_is_fresh_in Y (patt_free_evar x)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ)
(patt_free_svar x)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
size (patt_free_svar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in X (patt_free_svar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in Y (patt_free_svar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ)
(patt_free_svar x)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
size (patt_free_svar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in X (patt_free_svar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in Y (patt_free_svar x)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
size (patt_free_svar x) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_free_svar x) HfrY: svar_is_fresh_in Y (patt_free_svar x)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ)
(patt_bound_evar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in X (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in Y (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ)
(patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in X (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in Y (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_evar n) HfrY: svar_is_fresh_in Y (patt_bound_evar n)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ)
(patt_bound_svar n)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in X (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in Y (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ)
(patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in X (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in Y (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_bound_svar n) HfrY: svar_is_fresh_in Y (patt_bound_svar n)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ)
(patt_sym sigma)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in X (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in Y (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ)
(patt_sym sigma)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in X (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in Y (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (patt_sym sigma) HfrY: svar_is_fresh_in Y (patt_sym sigma)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
eval (update_svar_val X S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext
(eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ1))
(eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2)) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext
(eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ1))
(eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2)) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2)) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y})
(eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) =
app_ext
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1))
(eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2))
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in X ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in Y ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y} =
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in X ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in Y ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X ⊥ HfrY: svar_is_fresh_in Y ⊥
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
eval (update_svar_val X S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤
∖ eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ1)
∪ eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2) =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤
∖ eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ1)
∪ eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2) =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val X S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ2) =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2) HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}
∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} =
⊤
∖ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ1)
∪ eval (update_svar_val Y S ρ)
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ2)
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
eval (update_svar_val X S ρ) (ex , ϕ)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (ex , ϕ)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
(letx :=
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ) in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ) ineval ρ'
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦x})) =
(letx :=
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ) in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val Y S ρ) ineval ρ'
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦x}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
(letx :=
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ) in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val X S ρ) ineval ρ'
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦x})) =
(letx :=
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ) in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_svar_val Y S ρ) ineval ρ'
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦x}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar X) dbi ϕ)) e
(update_svar_val X S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)}) =
propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar Y) dbi ϕ)) e
(update_svar_val Y S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦
fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
(λe : M,
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar X) dbi ϕ)) e
(update_svar_val X S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi x
phi1 $
bsvar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi x
phi1 --->
bsvar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi x
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x)
phi'
end)
(patt_free_svar
X)
dbi ϕ)}) =
(λe : M,
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar Y) dbi ϕ)) e
(update_svar_val Y S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi x
phi1 $
bsvar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi x
phi1 --->
bsvar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi x
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x)
phi'
end)
(patt_free_svar
Y)
dbi ϕ)})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ)
∀x : M,
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0)
phi'
end) (patt_free_svar X) dbi ϕ)) x
(update_svar_val X S ρ))
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' => ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x0 : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x0
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi
x0
phi1 $
bsvar_subst
psi
x0
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi
x0
phi1 --->
bsvar_subst
psi
x0
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi
x0
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x0)
phi'
end)
(patt_free_svar
X)
dbi ϕ)} =
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' =>
ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x0)
phi'
end) (patt_free_svar Y) dbi ϕ)) x
(update_svar_val Y S ρ))
((fix bsvar_subst
(psi : Pattern) (x0 : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x0 with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x0 phi1 $
bsvar_subst psi x0 phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x0 phi1 --->
bsvar_subst psi x0 phi2
| ex , phi' => ex , bsvar_subst psi x0 phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x0) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x0 : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x0
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi
x0
phi1 $
bsvar_subst
psi
x0
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi
x0
phi1 --->
bsvar_subst
psi
x0
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi
x0
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x0)
phi'
end)
(patt_free_svar
Y)
dbi ϕ)}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)) e
(update_svar_val X S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi x
phi1 $
bsvar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi x
phi1 --->
bsvar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi x
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x)
phi'
end)
(patt_free_svar
X)
dbi ϕ)} =
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)) e
(update_svar_val Y S ρ))
((fix bsvar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu , bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar
((fix
bsvar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
patt_bound_evar
n
| patt_bound_svar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_svar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_svar
(Nat.pred
n)
end
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bsvar_subst
psi x
phi1 $
bsvar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bsvar_subst
psi x
phi1 --->
bsvar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bsvar_subst
psi x
phi'
| mu ,
phi' =>
mu ,
bsvar_subst
psi
(Datatypes.S
x)
phi'
end)
(patt_free_svar
Y)
dbi ϕ)}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar X) dbi ϕ)) e
(update_svar_val X S ρ))
ϕ^{evar:0↦fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar X) dbi ϕ)}^{svar:dbi↦X} =
eval
(update_evar_val
(fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n => patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' => ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x) phi'
end) (patt_free_svar Y) dbi ϕ)) e
(update_svar_val Y S ρ))
ϕ^{evar:0↦fresh_evar
((fix bsvar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
patt_bound_evar n
| patt_bound_svar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_svar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_svar (Nat.pred n)
end
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bsvar_subst psi x phi1 $
bsvar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bsvar_subst psi x phi1 --->
bsvar_subst psi x phi2
| ex , phi' =>
ex , bsvar_subst psi x phi'
| mu , phi' =>
mu ,
bsvar_subst psi (Datatypes.S x)
phi'
end) (patt_free_svar Y) dbi ϕ)}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e
(update_svar_val X S ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e
(update_svar_val X S ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val X S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in X
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in Y
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
size ϕ ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in X
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in Y
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in X
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (ex , ϕ)) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in X
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (ex , ϕ)) HfrY: svar_is_fresh_in Y (ex , (ex , ϕ)) e: M
svar_is_fresh_in X
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (ex , ϕ)) HfrY: svar_is_fresh_in Y (ex , (ex , ϕ)) e: M
svar_is_fresh_in X ϕ
apply HfrX.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in Y
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in Y
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
svar_is_fresh_in Y ϕ
apply HfrY.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
X]} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
X]} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
size ϕ^{svar:dbi↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
evar_is_fresh_in (fresh_evar ϕ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
evar_is_fresh_in (fresh_evar ϕ) ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦
fresh_evar ϕ^[svar:dbi↦
patt_free_svar Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e
(update_svar_val Y S ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_svar_val Y S
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} =
eval
(update_svar_val Y S
(update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ))
ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar
ϕ^[svar:dbi↦patt_free_svar
Y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , ϕ) HfrY: svar_is_fresh_in Y (ex , ϕ) e: M
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^[svar:dbi↦patt_free_svar Y]^{evar:0↦fresh_evar
ϕ^[svar:dbi↦
patt_free_svar
Y]} =
eval
(update_svar_val Y S
(update_evar_val
(fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ))
ϕ^[svar:dbi↦patt_free_svar Y]^{evar:0↦fresh_evar
ϕ^[svar:dbi↦
patt_free_svar
Y]}
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
eval (update_svar_val X S ρ) (mu , ϕ)^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) (mu , ϕ)^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
eval (update_svar_val X S ρ)
(mu , ϕ^{svar:increase_mu pm_spec_data dbi↦X}) =
eval (update_svar_val Y S ρ)
(mu , ϕ^{svar:increase_mu pm_spec_data dbi↦Y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
eval (update_svar_val X S ρ)
(mu , ϕ^{svar:Datatypes.S dbi↦X}) =
eval (update_svar_val Y S ρ)
(mu , ϕ^{svar:Datatypes.S dbi↦Y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
(letX0 := fresh_svar ϕ^{svar:Datatypes.S dbi↦X} in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X0 S0 (update_svar_val X S ρ)
ineval ρ' ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X0})) =
(letX := fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X S0 (update_svar_val Y S ρ)
ineval ρ' ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦X}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S0
(update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar
ϕ^{svar:
Datatypes.S
dbi↦X}}) =
LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S0
(update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar
ϕ^{svar:
Datatypes.S
dbi↦Y}})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S0
(update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar
ϕ^{svar:
Datatypes.S
dbi↦X}}) =
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S0
(update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar
ϕ^{svar:
Datatypes.S
dbi↦Y}})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ)
∀x : propset M,
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) x
(update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar
ϕ^{svar:Datatypes.S
dbi↦X}} =
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) x
(update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar
ϕ^{svar:Datatypes.S
dbi↦Y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S'
(update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar
ϕ^{svar:Datatypes.S
dbi↦X}} =
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S'
(update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar
ϕ^{svar:Datatypes.S
dbi↦Y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval
(update_svar_val
(fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S'
(update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar
ϕ^{svar:Datatypes.S
dbi↦Y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ)))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ))))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B)
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ))))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B)
fresh3 ∉ B
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ))))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ))))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B)
fresh3 ∉ B
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B: SVarSet HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪ free_svars ϕ))))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ HeqB: B =
{[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X} ∪ B0)))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ B1))) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 B2: SVarSet HeqB2: B2 = {[Y']} ∪ B1 HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ B2)) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 B2: SVarSet HeqB2: B2 = {[Y']} ∪ B1 B3: SVarSet HeqB3: B3 = {[X']} ∪ B2 HeqB: B = {[X]} ∪ ({[Y]} ∪ B3) fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 B2: SVarSet HeqB2: B2 = {[Y']} ∪ B1 B3: SVarSet HeqB3: B3 = {[X']} ∪ B2 B4: SVarSet HeqB4: B4 = {[Y]} ∪ B3 HeqB: B = {[X]} ∪ B4 fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 B2: SVarSet HeqB2: B2 = {[Y']} ∪ B1 B3: SVarSet HeqB3: B3 = {[X']} ∪ B2 B4: SVarSet HeqB4: B4 = {[Y]} ∪ B3 HeqB: B = {[X]} ∪ B4 fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[X]} ∪ B4
↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} B, B0: SVarSet HeqB0: B0 =
free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ B1: SVarSet HeqB1: B1 =
free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 B2: SVarSet HeqB2: B2 = {[Y']} ∪ B1 B3: SVarSet HeqB3: B3 = {[X']} ∪ B2 B4: SVarSet HeqB4: B4 = {[Y]} ∪ B3 HeqB: B = {[X]} ∪ B4 fresh3: svar Heqfresh3: fresh3 = svar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[X]} ∪ B4
↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[Y]} ∪ B3
↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' HB: (fresh3 ∉ {[Y']})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ) Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) i3: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ)
↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ∉ {[Y']} HB: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ) Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) i3: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ)
↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HB: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ) Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) i3: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ)
↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) i3: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ)
↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X})
∧ fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HB: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
∪ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y})
∧ fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval (update_svar_val X' S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ^{svar:Datatypes.S dbi↦X} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval (update_svar_val Y' S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ^{svar:Datatypes.S dbi↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
0 < Datatypes.S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:0↦fresh3}^{svar:
Init.Nat.pred (Datatypes.S dbi)↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred
(Datatypes.S dbi)↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
0 < Datatypes.S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:0↦fresh3}^{svar:
Init.Nat.pred (Datatypes.S dbi)↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:0↦fresh3}^{svar:
Init.Nat.pred (Datatypes.S dbi)↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred
(Datatypes.S dbi)↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred
(Datatypes.S dbi)↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val fresh3 S' (update_svar_val X S ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ≠ X
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val fresh3 S' (update_svar_val Y S ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ≠ Y
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (mu , ϕ) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (mu , ϕ) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val X S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦X} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ^{svar:0↦fresh3} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
X ∉ free_svars ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
X ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
X ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
X ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
X ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) Contra: X = fresh3
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) Contra: fresh3 = X
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
Y ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
Y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
Y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
Y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) Contra: Y = fresh3
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ))))))) Contra: fresh3 = Y
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz X, Y: svar S: propset M HfrX: svar_is_fresh_in X (ex , (mu , ϕ)) HfrY: svar_is_fresh_in Y (ex , (mu , ϕ)) S': propset M X': svar HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X} Y': svar HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} fresh3: svar Hneqfr1: fresh3 ≠ X Hneqfr2: fresh3 ≠ Y Hneqfr11: fresh3 ≠ X' Hneqfr22: fresh3 ≠ Y' HnotinFree1: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} HnotinFree2: fresh3
∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} HnotinFree: fresh3 ∉ free_svars ϕ Heqfresh3: fresh3 =
svar_fresh
(elements
({[X]}
∪ ({[Y]}
∪ ({[X']}
∪ ({[Y']}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦X}
∪ (free_svars
ϕ^{svar:
Datatypes.S dbi↦Y}
∪
free_svars ϕ)))))))
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} =
eval
(update_svar_val Y S (update_svar_val fresh3 S' ρ))
ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz
∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
(* inductive case - evar *)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: size ϕ ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ϕ Hfry: evar_is_fresh_in y ϕ
eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val x c ρ)
(patt_free_evar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ)
(patt_free_svar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
(patt_bound_evar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ)
(patt_bound_svar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ)
(patt_sym sigma)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
eval (update_evar_val x c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
eval (update_evar_val x c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
eval (update_evar_val x c ρ) (ex , ϕ)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ex , ϕ)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
eval (update_evar_val x c ρ) (mu , ϕ)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (mu , ϕ)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val x c ρ)
(patt_free_evar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
size (patt_free_evar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in x (patt_free_evar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in y (patt_free_evar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y} =
eval (update_evar_val y c ρ)
(patt_free_evar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
size (patt_free_evar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in x (patt_free_evar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in y (patt_free_evar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
size (patt_free_evar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: evar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_evar x0) Hfry: evar_is_fresh_in y (patt_free_evar x0)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ)
(patt_free_svar x0)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
size (patt_free_svar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in x (patt_free_svar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in y (patt_free_svar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y} =
eval (update_evar_val y c ρ)
(patt_free_svar x0)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
size (patt_free_svar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in x (patt_free_svar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in y (patt_free_svar x0)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
size (patt_free_svar x0) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) x0: svar dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_free_svar x0) Hfry: evar_is_fresh_in y (patt_free_svar x0)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ)
(patt_bound_evar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in x (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in y (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y} =
eval (update_evar_val y c ρ)
(patt_bound_evar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in x (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in y (patt_bound_evar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
size (patt_bound_evar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_evar n) Hfry: evar_is_fresh_in y (patt_bound_evar n)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ)
(patt_bound_svar n)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in x (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in y (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y} =
eval (update_evar_val y c ρ)
(patt_bound_svar n)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in x (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in y (patt_bound_svar n)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
size (patt_bound_svar n) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) n, dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_bound_svar n) Hfry: evar_is_fresh_in y (patt_bound_svar n)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ)
(patt_sym sigma)^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in x (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in y (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y} =
eval (update_evar_val y c ρ)
(patt_sym sigma)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in x (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in y (patt_sym sigma)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
size (patt_sym sigma) ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) sigma: symbols dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (patt_sym sigma) Hfry: evar_is_fresh_in y (patt_sym sigma)
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
eval (update_evar_val x c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext
(eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ1))
(eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2)) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext
(eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ1))
(eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2)) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2)) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2) Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y})
(eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) =
app_ext
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1))
(eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2))
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in x ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in y ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y} =
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in x ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in y ⊥
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
size ⊥ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) dbi: db_index ρ: Valuation Hsz: 0 ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x ⊥ Hfry: evar_is_fresh_in y ⊥
0 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
eval (update_evar_val x c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤
∖ eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ1)
∪ eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2) =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤
∖ eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ1)
∪ eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2) =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val x c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ2) =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y (ϕ1 $ ?ϕ₂)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y (?ϕ₁ $ ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ1, ϕ2: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ1 + size ϕ2) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2) Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}
∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} =
⊤
∖ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ1)
∪ eval (update_evar_val y c ρ)
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ2)
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
eval (update_evar_val x c ρ) (ex , ϕ)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (ex , ϕ)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
eval (update_evar_val x c ρ) (ex , ϕ^{evar:S dbi↦x}) =
eval (update_evar_val y c ρ)
(ex , ϕ^{evar:increase_ex pm_spec_data dbi↦y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
eval (update_evar_val x c ρ) (ex , ϕ^{evar:S dbi↦x}) =
eval (update_evar_val y c ρ) (ex , ϕ^{evar:S dbi↦y})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
(letx0 := fresh_evar ϕ^{evar:S dbi↦x} in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x0 e (update_evar_val x c ρ)
ineval ρ' ϕ^{evar:S dbi↦x}^{evar:0↦x0})) =
(letx := fresh_evar ϕ^{evar:S dbi↦y} in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_evar_val y c ρ) ineval ρ' ϕ^{evar:S dbi↦y}^{evar:0↦x}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
(letx0 := fresh_evar ϕ^{evar:S dbi↦x} in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x0 e (update_evar_val x c ρ)
ineval ρ' ϕ^{evar:S dbi↦x}^{evar:0↦x0})) =
(letx := fresh_evar ϕ^{evar:S dbi↦y} in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e (update_evar_val y c ρ) ineval ρ' ϕ^{evar:S dbi↦y}^{evar:0↦x}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
propset_fa_union
(λe : M,
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦x})
e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦x}}) =
propset_fa_union
(λe : M,
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦y})
e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦y}})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
(λe : M,
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) e
(update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦x}}) =
(λe : M,
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e
(update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦y}})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ)
∀x0 : M,
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) x0
(update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦x}} =
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) x0
(update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar
ϕ^{evar:S dbi↦y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) e
(update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦x}} =
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e
(update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval
(update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e
(update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)))))
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B)
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B)
fresh3 ∉ B
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B)
fresh3 ∉ B
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B: EVarSet HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ HeqB: B =
{[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x} ∪ B0)))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ B1))) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ B2)) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 HeqB: B = {[x]} ∪ ({[y]} ∪ B3) fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[y]} ∪ B3
↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[y]} ∪ B3
↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3 i1: fresh3 ∉ {[x']} ∪ B2
↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[y]} ∪ B3
↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3 i1: fresh3 ∉ {[x']} ∪ B2
↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2 i2: fresh3 ∉ {[y']} ∪ B1
↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B0: EVarSet HeqB0: B0 =
free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ B1: EVarSet HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0 B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[y]} ∪ B3
↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3 i1: fresh3 ∉ {[x']} ∪ B2
↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2 i2: fresh3 ∉ {[y']} ∪ B1
↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1 i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ B0
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3 ∉ B0
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} B, B1: EVarSet HeqB1: B1 =
free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) B2: EVarSet HeqB2: B2 = {[y']} ∪ B1 B3: EVarSet HeqB3: B3 = {[x']} ∪ B2 B4: EVarSet HeqB4: B4 = {[y]} ∪ B3 HeqB: B = {[x]} ∪ B4 fresh3: evar Heqfresh3: fresh3 = evar_fresh (elements B) HB: fresh3 ∉ B i: fresh3 ∉ {[x]} ∪ B4
↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4 i0: fresh3 ∉ {[y]} ∪ B3
↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3 i1: fresh3 ∉ {[x']} ∪ B2
↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2 i2: fresh3 ∉ {[y']} ∪ B1
↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1 i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y HB: fresh3
∉ {[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i1: fresh3
∉ {[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)))
↔ (fresh3 ∉ {[x']})
∧ fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y HB: (fresh3 ∉ {[x']})
∧ fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i1: fresh3
∉ {[x']}
∪ ({[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)))
↔ (fresh3 ∉ {[x']})
∧ fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y HB: (fresh3 ∉ {[x']})
∧ fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ∉ {[x']} HB: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' HB: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ)) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' HB: (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i2: fresh3
∉ {[y']}
∪ (free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ))
↔ (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y}
∪ free_evars ϕ) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' HB: (fresh3 ∉ {[y']})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ∉ {[y']} HB: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HB: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) i3: fresh3
∉ free_evars ϕ^{evar:S dbi↦x}
∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x})
∧ fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HB: fresh3
∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦y})
∧ fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval (update_evar_val x' e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦x'} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ^{evar:S dbi↦x} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval (update_evar_val y' e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ^{evar:S dbi↦y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:0↦fresh3}^{evar:
Init.Nat.pred (S dbi)↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:0↦fresh3}^{evar:
Init.Nat.pred (S dbi)↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:0↦fresh3}^{evar:
Init.Nat.pred (S dbi)↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val fresh3 e (update_evar_val x c ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ≠ x
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val fresh3 e (update_evar_val y c ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ≠ y
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , ϕ) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , ϕ) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val x c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦x} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ^{evar:0↦fresh3} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
x ∉ free_evars ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
x ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
x ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
x ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
x ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) Contra: x = fresh3
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) Contra: fresh3 = x
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
y ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
y ≠ fresh3
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) Contra: y = fresh3
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ))))))) Contra: fresh3 = y
False
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (ex , (ex , ϕ)) Hfry: evar_is_fresh_in y (ex , (ex , ϕ)) e: M x': evar Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x} y': evar Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y} fresh3: evar Hneqfr1: fresh3 ≠ x Hneqfr2: fresh3 ≠ y Hneqfr11: fresh3 ≠ x' Hneqfr22: fresh3 ≠ y' HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} HnotinFree: fresh3 ∉ free_evars ϕ Heqfresh3: fresh3 =
evar_fresh
(elements
({[x]}
∪ ({[y]}
∪ ({[x']}
∪ ({[y']}
∪ (free_evars
ϕ^{evar:
S dbi↦x}
∪ (free_evars
ϕ^{evar:
S dbi↦y}
∪
free_evars ϕ)))))))
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y} =
eval
(update_evar_val y c (update_evar_val fresh3 e ρ))
ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
reflexivity.
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
eval (update_evar_val x c ρ) (mu , ϕ)^{evar:dbi↦x} =
eval (update_evar_val y c ρ) (mu , ϕ)^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
(letX :=
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ) in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X S0 (update_evar_val x c ρ)
ineval ρ'
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦X})) =
(letX :=
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ) in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X S0 (update_evar_val y c ρ)
ineval ρ'
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦X}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
(letX :=
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ) in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X S0 (update_evar_val x c ρ)
ineval ρ'
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦X})) =
(letX :=
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ) in
LeastFixpointOf
(λS0 : propset M,
letρ' :=
update_svar_val X S0 (update_evar_val y c ρ)
ineval ρ'
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦X}))
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)) S0
(update_evar_val x c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)}) =
LeastFixpointOf
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)) S0
(update_evar_val y c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦
fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)) S0
(update_evar_val x c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
x)
dbi ϕ)}) =
(λS0 : propset M,
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)) S0
(update_evar_val y c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
y)
dbi ϕ)})
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ)
∀x0 : propset M,
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)) x0
(update_evar_val x c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
x)
dbi ϕ)} =
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)) x0
(update_evar_val y c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
y)
dbi ϕ)}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)) S'
(update_evar_val x c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
x)
dbi ϕ)} =
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)) S'
(update_evar_val y c ρ))
((fix bevar_subst
(psi : Pattern) (x : db_index) (phi : Pattern)
{struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' => ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar
((fix
bevar_subst
(psi : Pattern)
(x : db_index)
(phi : Pattern)
{struct
phi} :
Pattern :=
match
phi
with
| patt_free_evar
x' =>
patt_free_evar
x'
| patt_free_svar
x' =>
patt_free_svar
x'
| patt_bound_evar
n =>
match
compare_nat
n x
with
| Nat_less
_ _ _ =>
patt_bound_evar
n
| Nat_equal
_ _ _ =>
psi
| Nat_greater
_ _ _ =>
patt_bound_evar
(Nat.pred
n)
end
| patt_bound_svar
n =>
patt_bound_svar
n
| patt_sym
sigma =>
patt_sym
sigma
| phi1 $
phi2 =>
bevar_subst
psi x
phi1 $
bevar_subst
psi x
phi2
| ⊥ =>
⊥
| phi1 --->
phi2 =>
bevar_subst
psi x
phi1 --->
bevar_subst
psi x
phi2
| ex ,
phi' =>
ex ,
bevar_subst
psi
(S x)
phi'
| mu ,
phi' =>
mu ,
bevar_subst
psi x
phi'
end)
(patt_free_evar
y)
dbi ϕ)}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)) S'
(update_evar_val x c ρ))
ϕ^{svar:0↦fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar x) dbi ϕ)}^{evar:dbi↦x} =
eval
(update_svar_val
(fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} : Pattern :=
match phi with
| patt_free_evar x' => patt_free_evar x'
| patt_free_svar x' => patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ => patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n => patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' => mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)) S'
(update_evar_val y c ρ))
ϕ^{svar:0↦fresh_svar
((fix bevar_subst
(psi : Pattern) (x : db_index)
(phi : Pattern) {struct phi} :
Pattern :=
match phi with
| patt_free_evar x' =>
patt_free_evar x'
| patt_free_svar x' =>
patt_free_svar x'
| patt_bound_evar n =>
match compare_nat n x with
| Nat_less _ _ _ =>
patt_bound_evar n
| Nat_equal _ _ _ => psi
| Nat_greater _ _ _ =>
patt_bound_evar (Nat.pred n)
end
| patt_bound_svar n =>
patt_bound_svar n
| patt_sym sigma => patt_sym sigma
| phi1 $ phi2 =>
bevar_subst psi x phi1 $
bevar_subst psi x phi2
| ⊥ => ⊥
| phi1 ---> phi2 =>
bevar_subst psi x phi1 --->
bevar_subst psi x phi2
| ex , phi' =>
ex , bevar_subst psi (S x) phi'
| mu , phi' =>
mu , bevar_subst psi x phi'
end) (patt_free_evar y) dbi ϕ)}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
(update_evar_val x c ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦x} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val x c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦x} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in x
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in x
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in x
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , (mu , ϕ)) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in x
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , (mu , ϕ)) Hfry: evar_is_fresh_in y (mu , (mu , ϕ)) S': propset M
evar_is_fresh_in x
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , (mu , ϕ)) Hfry: evar_is_fresh_in y (mu , (mu , ϕ)) S': propset M
evar_is_fresh_in x ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
evar_is_fresh_in y ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar
ϕ^[evar:dbi↦patt_free_evar
x]} =
eval
(update_evar_val y c
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar
ϕ^[evar:dbi↦patt_free_evar
y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar
ϕ^[evar:dbi↦patt_free_evar
x]} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar
ϕ^[evar:dbi↦patt_free_evar
y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
size ϕ^{evar:dbi↦y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
size ϕ ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
svar_is_fresh_in (fresh_svar ϕ) ϕ
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦
fresh_svar ϕ^[evar:dbi↦
patt_free_evar y]}
signature: Signature M: Model sz: nat IHsz: ∀ (ϕ : Pattern) (dbi : db_index)
(ρ : Valuation),
size ϕ ≤ sz
→ (∀ (XY : svar) (S : propset M),
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ)
ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ)
ϕ^{svar:dbi↦Y})
∧ (∀ (xy : evar) (c : M),
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ)
ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ)
ϕ^{evar:dbi↦y}) ϕ: Pattern dbi: db_index ρ: Valuation Hsz: S (size ϕ) ≤ S sz x, y: evar c: M Hfrx: evar_is_fresh_in x (mu , ϕ) Hfry: evar_is_fresh_in y (mu , ϕ) S': propset M
eval
(update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^{evar:dbi↦y}} =
eval
(update_svar_val
(fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S'
(update_evar_val y c ρ))
ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar
ϕ^[evar:dbi↦patt_free_evar
y]}
reflexivity.}Qed.
signature: Signature M: Model ϕ: Pattern x, y: evar c: M dbi: db_index ρ: Valuation
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model ϕ: Pattern x, y: evar c: M dbi: db_index ρ: Valuation
evar_is_fresh_in x ϕ
→ evar_is_fresh_in y ϕ
→ eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature M: Model ϕ: Pattern x, y: evar c: M dbi: db_index ρ: Valuation Hfrx: evar_is_fresh_in x ϕ Hfry: evar_is_fresh_in y ϕ
eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} =
eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
eapply (proj2 (Private_eval_fresh_var_open (size ϕ) ϕ dbi ρ _) x y c); assumption.
signature: Signature M: Model ϕ: Pattern x, y: evar c: M dbi: db_index ρ: Valuation Hfrx: evar_is_fresh_in x ϕ Hfry: evar_is_fresh_in y ϕ
size ϕ ≤ size ϕ
lia.Qed.
signature: Signature M: Model ϕ: Pattern X, Y: svar S: propset M dbi: db_index ρ: Valuation
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model ϕ: Pattern X, Y: svar S: propset M dbi: db_index ρ: Valuation
svar_is_fresh_in X ϕ
→ svar_is_fresh_in Y ϕ
→ eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature M: Model ϕ: Pattern X, Y: svar S: propset M dbi: db_index ρ: Valuation HfrX: svar_is_fresh_in X ϕ HfrY: svar_is_fresh_in Y ϕ
eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} =
eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
eapply (proj1 (Private_eval_fresh_var_open (size ϕ) ϕ dbi ρ _) X Y S); assumption.
signature: Signature M: Model ϕ: Pattern X, Y: svar S: propset M dbi: db_index ρ: Valuation HfrX: svar_is_fresh_in X ϕ HfrY: svar_is_fresh_in Y ϕ
size ϕ ≤ size ϕ
lia.Qed.(* There are two ways how to plug a pattern phi2 into a pattern phi1: either substitute it for some variable, or evaluate phi2 first and then evaluate phi1 with valuation updated to the result of phi2 *)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (ex , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars (ex , phi1)
eval ρ (ex , phi1^[svar:dbi↦phi2]) =
eval (update_svar_val X (eval ρ phi2) ρ)
(ex , phi1)^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars (ex , phi1)
eval ρ (ex , phi1^[svar:dbi↦phi2]) =
eval (update_svar_val X (eval ρ phi2) ρ)
(ex , phi1)^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
eval ρ (ex , phi1^[svar:dbi↦phi2]) =
eval (update_svar_val X (eval ρ phi2) ρ)
(ex , phi1)^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
eval ρ (ex , phi1^[svar:dbi↦phi2]) =
eval (update_svar_val X (eval ρ phi2) ρ)
(ex , phi1)^[svar:dbi↦patt_free_svar X]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
eval ρ (ex , phi1^[svar:dbi↦phi2]) =
eval (update_svar_val X (eval ρ phi2) ρ)
(ex , phi1^[svar:dbi↦patt_free_svar X])
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
(letx := fresh_evar phi1^[svar:dbi↦phi2] in
propset_fa_union
(λe : M,
letρ' := update_evar_val x e ρ ineval ρ' phi1^[svar:dbi↦phi2]^{evar:0↦x})) =
(letx := fresh_evar phi1^[svar:dbi↦patt_free_svar X]
in
propset_fa_union
(λe : M,
letρ' :=
update_evar_val x e
(update_svar_val X (eval ρ phi2) ρ) ineval ρ'
phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦x}))
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar phi1^[svar:dbi↦phi2]) e ρ)
phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar
phi1^[svar:dbi↦phi2]}) =
propset_fa_union
(λe : M,
eval
(update_evar_val
(fresh_evar phi1^[svar:dbi↦patt_free_svar X])
e (update_svar_val X (eval ρ phi2) ρ))
phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar
phi1^[svar:dbi↦
patt_free_svar
X]})
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1
∀c : M,
eval
(update_evar_val (fresh_evar phi1^[svar:dbi↦phi2])
c ρ)
phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar
phi1^[svar:dbi↦phi2]} =
eval
(update_evar_val
(fresh_evar phi1^[svar:dbi↦patt_free_svar X]) c
(update_svar_val X (eval ρ phi2) ρ))
phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar
phi1^[svar:dbi↦
patt_free_svar
X]}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1 c: M
eval
(update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c
ρ)
phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar
phi1^[svar:dbi↦phi2]} =
eval
(update_evar_val
(fresh_evar phi1^[svar:dbi↦patt_free_svar X]) c
(update_svar_val X (eval ρ phi2) ρ))
phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar
phi1^[svar:dbi↦
patt_free_svar
X]}
(* x = fresh_evar phi1' *)(* y = evar_fresh (elements (free_evars phi1') U (free_evars phi2)) *)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1 c: M phi1': Pattern Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
eval
(update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c
ρ)
phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar
phi1^[svar:dbi↦phi2]} =
eval
(update_evar_val (fresh_evar phi1') c
(update_svar_val X (eval ρ phi2) ρ))
phi1'^{evar:0↦fresh_evar phi1'}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^[svar:dbi↦
patt_free_svar X] dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(ex , phi1) (S dbi) H: X ∉ free_svars phi1 c: M phi1': Pattern Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X] Xfr2': evar HeqXfr2': Xfr2' = fresh_evar phi1'
eval
(update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c
ρ)
phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar
phi1^[svar:dbi↦phi2]} =
eval
(update_evar_val Xfr2' c
(update_svar_val X (eval ρ phi2) ρ))
phi1'^{evar:0↦Xfr2'}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1^{svar:S dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦
fresh_svar phi1^[svar:
S dbi↦phi2]} =
eval
(update_svar_val Y E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1^{svar:S dbi↦X}
apply Hfreshy''.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val Y E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
Y ≠ X
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦
fresh_svar phi1^[svar:
S dbi↦phi2]} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val Y E ρ))
phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
Y ≠ X
apply Hfreshy'''.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val Y E ρ))
phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦
fresh_svar phi1^[svar:
S dbi↦phi2]} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val Y E ρ))
phi1^{svar:0↦Y}^{svar:
Init.Nat.pred (S dbi)↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val Y E ρ))
phi1^{svar:0↦Y}^{svar:Init.Nat.pred (S dbi)↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val Y E ρ))
phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val X
(eval (update_svar_val Y E ρ) phi2)
(update_svar_val Y E ρ))
phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi2 = eval ρ phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi2 = eval ρ phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi2
apply Hfreshy''''.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval
(update_svar_val X
(eval (update_svar_val Y E ρ) phi2)
(update_svar_val Y E ρ))
phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1^{svar:0↦Y} (S dbi)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1^{svar:0↦Y} (S dbi)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 ≤ S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S (S dbi)) = true
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S (S dbi)) = true
auto.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
X ≠ Y
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
Y ≠ X
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars phi1 E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
apply H.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
apply Hwfc2.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1 ≤ sz
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1 ≤ sz
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar
phi1^[svar:S dbi↦phi2]} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar:
Init.Nat.pred (S dbi)↦phi2] =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
apply Hwfc2.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar:
Init.Nat.pred (S dbi)↦phi2] =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
eval
(update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2])
E ρ)
phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar:
Init.Nat.pred (S dbi)↦phi2] =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^{svar:0↦X'}^[svar:Init.Nat.pred (S dbi)↦phi2] =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
well_formed_closed phi2
apply Hwfc2.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^{svar:0↦Y}^[svar:Init.Nat.pred (S dbi)↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
well_formed_closed phi2
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
well_formed_closed phi2
apply Hwfc2.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
lia.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦X'} =
eval (update_svar_val Y E ρ)
phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
svar_is_fresh_in X' phi1^[svar:S dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi) X': svar HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
svar_is_fresh_in X' phi1^[svar:S dbi↦phi2]
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: true = bsvar_occur phi1 (S dbi)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: size (mu , phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M phi_subst: Pattern Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2] B: SVarSet HeqB: B =
free_svars phi_subst ∪ {[fresh_svar phi1]}
∪ free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar
phi1^{svar:S dbi↦X}}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M phi_subst: Pattern Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2] B: SVarSet HeqB: B =
free_svars phi_subst ∪ {[fresh_svar phi1]}
∪ free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar
phi1^{svar:S dbi↦X}}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar
phi1^{svar:S dbi↦X}}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S dbi)
apply wfc_mu_lower; auto.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) e: X = fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) e: X = fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val (fresh_svar phi1) (eval ρ phi2)
ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval (update_svar_val (fresh_svar phi1) E ρ)
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in (fresh_svar phi1) phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1
apply Hfreshy'.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: fresh_svar phi1 ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1}
∪ {[fresh_svar phi1]} ∪
free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy''': Y ≠ fresh_svar phi1 Hfreshy'': svar_is_fresh_in Y
phi1^{svar:S dbi↦fresh_svar phi1} Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in (fresh_svar phi1) phi1
apply set_svar_fresh_is_fresh.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val (fresh_svar phi1) E
(update_svar_val X (eval ρ phi2) ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
fresh_svar phi1 ≠ X
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val (fresh_svar phi1) E ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
fresh_svar phi1 ≠ X
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
X ≠ fresh_svar phi1
apply n.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval
(update_svar_val X (eval ρ phi2)
(update_svar_val (fresh_svar phi1) E ρ))
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval (update_svar_val (fresh_svar phi1) E ρ)
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
X ≠ fresh_svar phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars phi1 E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1
apply H.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} =
eval (update_svar_val (fresh_svar phi1) E ρ)
phi1^{svar:0↦fresh_svar phi1}
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in Y phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in (fresh_svar phi1) phi1
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
svar_is_fresh_in Y phi1
apply Hfreshy'.
signature: Signature M: Model sz: nat IHsz: ∀ (dbi : db_index) (phi1phi2 : Pattern),
size phi1 ≤ sz
→ ∀ (ρ : Valuation) (X : svar),
well_formed_closed phi2
→ well_formed_closed_mu_aux phi1 (S dbi)
→ X ∉ free_svars phi1
→ eval ρ phi1^[svar:dbi↦phi2] =
eval
(update_svar_val X
(eval ρ phi2) ρ)
phi1^{svar:dbi↦X} dbi: db_index phi1, phi2: Pattern Hsz: S (size phi1) ≤ S sz ρ: Valuation X: svar Hwfc2: well_formed_closed phi2 Hwfphi1: well_formed_closed_mu_aux
(mu , phi1) (S dbi) H: X ∉ free_svars (mu , phi1) E: propset M B: SVarSet HeqB: B =
free_svars phi1^[svar:S dbi↦phi2]
∪ {[fresh_svar phi1]} ∪
free_svars phi1
∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]}
∪ free_svars phi2 Y: svar HeqY: Y = svar_fresh (elements B) Hfreshy: Y ≠ fresh_svar phi1 Hfreshy': svar_is_fresh_in Y phi1 Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X} Hfreshy''': Y ≠ X Hfreshy'''': svar_is_fresh_in Y phi2 Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2] HeqHoc: false = bsvar_occur phi1 (S dbi) n: X ≠ fresh_svar phi1
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval
(update_evar_val x (evar_valuation ρ y)
(update_evar_val yB c ρ))
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val x (evar_valuation ρ y) ρ')
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val x (evar_valuation ρ y) ρ')
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val x (evar_valuation ρ y) ρ')
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val x (evar_valuation ρ y) ρ')
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val x (evar_valuation ρ' y) ρ')
phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
eval (update_evar_val x' c ρ)
phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y] =
eval (update_evar_val yB c ρ)
phi^{evar:0↦yB}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar
y]
(* Now svar_open does nothing to phi1, since it does not contain dbi (see HeqHoc). *)(* symmetry in HeqHoc. apply evar_open_not_occur with (x1:=x) in HeqHoc. *)(* X is not free in phi1, so the fact that in evar_val' it is updated to some value is irrelevant. *)
evar_is_fresh_in x ϕ
→ M_predicate M ϕ^{evar:0↦fresh_evar ϕ}
→ M_predicate M ϕ^{evar:0↦x}
signature: Signature M: Model x: evar ϕ: Pattern
evar_is_fresh_in x ϕ
→ M_predicate M ϕ^{evar:0↦fresh_evar ϕ}
→ M_predicate M ϕ^{evar:0↦x}
signature: Signature M: Model x: evar ϕ: Pattern Hfr: evar_is_fresh_in x ϕ H: M_predicate M ϕ^{evar:0↦fresh_evar ϕ}
M_predicate M ϕ^{evar:0↦x}
apply M_predicate_evar_open_fresh_evar_1 with (x₁ := fresh_evar ϕ); auto.Qed.(* Similar to plugging_patterns: using free svar substitution instead of bound svar substitution. TODO: we may be able to gneeralize this lemma to non-closed psi, if we deal with nest_mu properly *)
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) H0: size phi = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H: MuZ ∉ free_svars phi H3: MuZ ∉ free_svars psi H2: MuZ ∉ free_svars phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal21?Goal22?Goal23: eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} =
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) H0: size phi = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H: MuZ ∉ free_svars phi H3: MuZ ∉ free_svars psi H2: MuZ ∉ free_svars phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal21?Goal22?Goal23: eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} =
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) H0: size phi = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H: MuZ ∉ free_svars phi H3: MuZ ∉ free_svars psi H2: MuZ ∉ free_svars phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal21?Goal22?Goal23: eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) m: nat H0: S (size phi) ≤ sz H: m = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars phi H4: MuZ ∉ free_svars psi H3: MuZ ∉ free_svars phi^[[svar:X↦psi]] H2: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal23?Goal24: well_formed_closed phi^{svar:0↦MuZ}
→ eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) m: nat H0: S (size phi) ≤ sz H: m = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars phi H4: MuZ ∉ free_svars psi H3: MuZ ∉ free_svars phi^[[svar:X↦psi]] H2: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal23?Goal24: well_formed_closed phi^{svar:0↦MuZ}
→ eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} =
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) m: nat H0: S (size phi) ≤ sz H: m = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars phi H4: MuZ ∉ free_svars psi H3: MuZ ∉ free_svars phi^[[svar:X↦psi]] H2: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal24?Goal25: well_formed_closed phi^{svar:0↦MuZ}
→ eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} =
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model sz: nat IHsz: ∀ (phipsi : Pattern)
(X : svar) (ρ : Valuation),
size phi ≤ sz
→ well_formed psi
→ well_formed_closed phi
→ eval ρ phi^[[svar:X↦psi]] =
eval (update_svar_val X (eval ρ psi) ρ)
phi phi, psi: Pattern X: svar ρ: Valuation Hsz: S (size phi) ≤ S sz Hwf: well_formed psi Hwfc: well_formed_closed (mu , phi) m: nat H0: S (size phi) ≤ sz H: m = sz x: propset M MuZ: svar HeqMuZ: MuZ =
svar_fresh
(elements
(free_svars phi ∪ free_svars psi
∪ free_svars phi^[[svar:X↦psi]]
∪ free_svars (patt_free_svar X))) MuX: svar HeqMuX: MuX = fresh_svar phi MuY: svar HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]] H1: MuZ ∉ free_svars phi H4: MuZ ∉ free_svars psi H3: MuZ ∉ free_svars phi^[[svar:X↦psi]] H2: MuZ ∉ free_svars (patt_free_svar X) e:= IHsz phi^{svar:0↦MuZ} psi X
(update_svar_val MuZ x ρ)
?Goal23?Goal24: well_formed_closed phi^{svar:0↦MuZ}
→ eval (update_svar_val MuZ x ρ)
phi^{svar:0↦MuZ}^[[svar:X↦psi]] =
eval
(update_svar_val X
(eval (update_svar_val MuZ x ρ) psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} =
eval
(update_svar_val X (eval ρ psi)
(update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature M: Model ϕ: Pattern ρ: Valuation m₂: M Hm₂: m₂ ∈ {[m₂]} Hm: eval ρ ϕ = {[m₂]}
m₂ = m₂
signature: Signature M: Model ϕ: Pattern ρ: Valuation m₂: M Hm: eval ρ ϕ = {[m₂]}
m₂ = m₂
reflexivity.Qed.Endwith_model.Endsemantics.ModuleNotations.Notation"M ⊨ᴹ phi" := (satisfies_model M phi) (left associativity, at level50) : ml_scope.(* FIXME this should not be called `satisfies` *)Notation"G ⊨ phi" := (satisfies G phi) (left associativity, at level50) : ml_scope.Notation"M ⊨ᵀ Gamma" := (satisfies_theory M Gamma)
(left associativity, at level50) : ml_scope.EndNotations.(*Module Hints.*)#[export]
Hint Resolve M_predicate_impl : core.#[export]
Hint Resolve M_predicate_bott : core.#[export]
Hint Resolve M_predicate_exists : core.#[export]
Hint Extern4 (M_predicate _ (evar_open _ _ _)) => mlSimpl : core.#[export]
Hint Extern4 (T_predicate _ (evar_open _ _ _)) => mlSimpl : core.#[export]
Hint Extern4 (M_predicate _ (svar_open _ _ _)) => mlSimpl : core.#[export]
Hint Extern4 (T_predicate _ (svar_open _ _ _)) => mlSimpl : core.#[export]
Hint Resolve T_predicate_impl_M_predicate : core.#[export]
Hint Resolve T_predicate_impl : core.#[export]
Hint Resolve T_predicate_bot : core.(*End Hints.*)
Σ: Signature M: Model
Proper (equiv ==> equiv ==> equiv) app_ext
Σ: Signature M: Model
Proper (equiv ==> equiv ==> equiv) app_ext
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
app_ext X Y ≡ app_ext X' Y'
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
≡ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
∀x : M,
x
∈ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
→ x
∈ {[ e | ∃lere : M,
le ∈ X'
∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: x
∈ {[ e | ∃lere : M,
le ∈ X
∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
x
∈ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
x
∈ {[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
∃re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
le ∈ X'
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
le ∈ X'
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
le ∈ X
assumption.
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
re ∈ Y'
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
re ∈ Y'
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
re ∈ Y
assumption.
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X Hre: re ∈ Y Hx: x ∈ app_interp M le re
x ∈ app_interp M le re
assumption.
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
{[ e | ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
⊆ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y'
∀x : M,
x
∈ {[ e | ∃lere : M,
le ∈ X'
∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
→ x
∈ {[ e | ∃lere : M,
le ∈ X
∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: x
∈ {[ e | ∃lere : M,
le ∈ X'
∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
x
∈ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
x
∈ {[ e | ∃lere : M,
le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x: M Hx: ∃lere : M,
le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
∃lere : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
∃lere : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
∃re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
le ∈ X
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
le ∈ X
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
le ∈ X'
assumption.
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
re ∈ Y
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
x ∈ app_interp M le re
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
re ∈ Y
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re
re ∈ Y'
assumption.
Σ: Signature M: Model X, X': propset M HXX': X ≡ X' Y, Y': propset M HYY': Y ≡ Y' x, le, re: M Hle: le ∈ X' Hre: re ∈ Y' Hx: x ∈ app_interp M le re